// /pages/booking-form/booking-form.js

// 导入所需模块和工具函数
const app = getApp();
import { validatePhone } from '../../utils/validators.js';
import { formatDisplayTime } from '../../utils/formatters.js';

Page({
  /**
   * 页面的初始数据
   */
  data: {
    // 预约核心信息
    deviceId: null,
    startDateTime: '',
    endDateTime: '',
    
    // 页面展示数据
    deviceInfo: {},
    displayTime: '',
    
    // 与WXML表单双向绑定的数据对象
    formData: {
      name: '',
      phone: '',
      researchGroup: '',
      remarks: ''
    },

    // 【新增】用于控制各输入框是否锁定的状态对象
    isLocked: {
      name: false,
      phone: false,
      researchGroup: false
    },

    // 页面状态控制
    isSubmitting: false,
  },

  /**
   * 生命周期函数 -- 监听页面加载
   */
  onLoad(options) {
    // 1. 存储并格式化从上个页面传来的核心数据
    this.setData({
      deviceId: options.deviceId,
      startDateTime: options.start,
      endDateTime: options.end,
      displayTime: formatDisplayTime(options.start, options.end)
    });
    
    // 2. 初始化表单（执行预填和锁定逻辑）
    this.initializeForm();
    // 3. 异步获取设备详情
    this.fetchDeviceDetails();
  },

  /**
   * [核心改动] - 表单初始化函数
   * 从全局数据中读取用户信息，预填到表单中，并根据情况锁定输入框
   */
  initializeForm() {
    const userInfo = app.globalData.userInfo;
    if (!userInfo) return; // 如果全局用户信息不存在，则不执行任何操作

    // 创建临时的 data 对象，用于一次性更新，提高性能
    const updateData = {
      formData: { ...this.data.formData }, // 继承已有的formData
      isLocked: { ...this.data.isLocked }   // 继承已有的isLocked
    };

    // 检查并处理“真实姓名”
    if (userInfo.real_name) {
      updateData.formData.name = userInfo.real_name;
      updateData.isLocked.name = true; // 锁定姓名输入框
    }
    // 检查并处理“手机号”
    if (userInfo.phone) {
      updateData.formData.phone = userInfo.phone;
      updateData.isLocked.phone = true; // 锁定手机号输入框
    }
    // 检查并处理“课题组”
    if (userInfo.group_name) {
      updateData.formData.researchGroup = userInfo.group_name;
      updateData.isLocked.researchGroup = true; // 锁定课题组输入框
    }
    
    // 使用 setData 一次性更新所有数据到页面
    this.setData(updateData);
  },

  /**
   * [事件处理] - 当用户在输入框中输入时触发
   * 负责将WXML输入框的改动，同步回JS的data中
   */
  onInputChange(e) {
    const field = e.currentTarget.dataset.field;
    const value = e.detail.value;
    this.setData({
      [`formData.${field}`]: value
    });
  },

  /**
   * [新增] [事件处理] - 当用户点击输入框时触发
   * 专门用于处理点击“已锁定”输入框的引导提示
   */
  onLockedInputTap(e) {
    // 获取被点击的输入框对应的字段名，例如 'name' 或 'phone'
    const field = e.currentTarget.dataset.field;
    // 检查该字段是否处于锁定状态
    if (this.data.isLocked[field]) {
      // 如果已锁定，则弹出提示
      wx.showToast({
        title: '如需修改，请前往“个人中心”修改个人信息',
        icon: 'none',
        duration: 2000 // 提示显示2秒
      });
    }
  },

  /**
   * [网络流程] - 获取设备详细信息
   */
  async fetchDeviceDetails() {
    try {
      const deviceData = await app.request({
        url: `/api/app/devices/${this.data.deviceId}`
      });
      this.setData({ deviceInfo: deviceData });
    } catch (err) {
      console.error("获取设备详情失败", err);
    }
  },
  
  /**
   * [核心流程] - 用户点击“确认提交”按钮
   */
  async onSubmit() {
    // 【优化】不再使用 e.detail.value，而是直接从 this.data.formData 获取最终数据
    if (this.data.isSubmitting) return;

    const formData = this.data.formData;
    if (!this.validateForm(formData)) return;

    this.setData({ isSubmitting: true });
    wx.showLoading({ title: '正在提交...' });

    const requestData = {
      device_id: parseInt(this.data.deviceId),
      start_time: this.data.startDateTime.replace(' ', 'T'),
      end_time: this.data.endDateTime.replace(' ', 'T'),
      contact_name: formData.name,
      contact_phone: formData.phone,
      contact_group: formData.researchGroup || '无',
      remarks: formData.remarks || ''
    };

    try {
      await app.request({
        url: '/api/app/orders/reserve',
        method: 'POST',
        data: requestData
      });

      wx.showToast({ title: '预约成功！', icon: 'success', duration: 1500 });
      await new Promise(resolve => setTimeout(resolve, 1500));
      wx.reLaunch({ url: '/pages/booking/booking' });

    } catch (err) {
      if (err.statusCode === 409) {
        wx.showToast({ title: '该时段刚被预约，请重选', icon: 'none', duration: 2500 });
      }
      console.error("提交预约失败", err);
    } finally {
      wx.hideLoading();
      this.setData({ isSubmitting: false });
    }
  },

  /**
   * [辅助函数] - 对表单数据进行统一校验
   */
  validateForm(formData) {
    if (!formData.name || formData.name.trim() === '') {
      wx.showToast({ title: '请输入您的姓名', icon: 'none' });
      return false;
    }
    if (!validatePhone(formData.phone)) {
      wx.showToast({ title: '请输入正确的手机号', icon: 'none' });
      return false;
    }
    return true;
  },
});